package com.rla.common.utils.redis;


import cn.hutool.core.util.StrUtil;
import com.rla.common.constant.CacheConstants;
import com.rla.common.utils.DateUtils;
import com.rla.common.utils.StringUtils;

/**
 * @Author: wjzh
 * @ClassName: RedisNoGenerateUtils
 * @Date: Created in 9:33 2023/2/1
 * @Description: 通过redis生成有序唯一单号
 */

public class RedisNoGenerateUtils {
    /**
     * 一天的秒数
     */
    private static final long time = 60 * 60 * 24;

    /**
     * 生成的编号为 前缀+年月日 + 序列
     *
     * @param prefix 前缀
     */
    public static String getNo(String prefix,int fillLen,boolean date,String keySuffix) {
        String no = StringUtils.isNotEmpty(keySuffix)?keySuffix:"";
        if(date){
            no = no + DateUtils.dateTimeNow().substring(0, 8);
        }
        //保存redis中的key，注意不要重复
        String redisKey = CacheConstants.UNIQUE_NO + no;
        //利用increment即redis原生incrBy命令的原子性特性生成递增的序列号
        Long increment = RedisUtils.incrAtomicValue(redisKey);
        if (increment == null) {
            throw new RuntimeException("redis命令执行失败");
        }
        //设置自动过期时间
        if(date){
            RedisUtils.expire(redisKey, time * 3);
        }
        String resultNo = StringUtils.isNotEmpty(prefix)?prefix:"";
        if(date){
            resultNo = resultNo + DateUtils.dateTimeNow().substring(0, 8);
        }
        return resultNo + StrUtil.fillBefore(increment.toString(),'0',fillLen);
    }

    /**
     * @param prefix  前缀
     * @param fillLen  顺序号位数，不够前面补0
     * @param date  序号中是否增加年月日  true 是 false 否
     * @param keySuffix  系统中业务标识，全局唯一 数据库表名驼峰小写 如订单表 mall_order 传 mallOrder   采购入库表 wms_in_store 传 wmsInStore
     * @param prefix  拆分符号 "-"
     *
     * 例：String deptId = LoginHelper.getDeptId().toString();
     *     RedisNoGenerateUtils.getNo("XSD"+deptId,5,true,"mallOrder","-");
     * */
    public static String getNo(String prefix,int fillLen,boolean date,String keySuffix,String splitFix) {
        String no = StringUtils.isNotEmpty(keySuffix)?keySuffix:"";
        if(date){
            no = no + DateUtils.dateTimeNow().substring(0, 8);
        }
        //保存redis中的key，注意不要重复
        String redisKey = CacheConstants.UNIQUE_NO + no;
        //利用increment即redis原生incrBy命令的原子性特性生成递增的序列号
        Long increment = RedisUtils.incrAtomicValue(redisKey);
        if (increment == null) {
            throw new RuntimeException("redis命令执行失败");
        }
        //设置自动过期时间
        if(date){
            RedisUtils.expire(redisKey, time * 3);
        }
        String resultNo = StringUtils.isNotEmpty(prefix)?prefix:"";
        if(date){
            resultNo = resultNo +splitFix+ DateUtils.dateTimeNow().substring(0, 8);
        }
        return resultNo +splitFix+ StrUtil.fillBefore(increment.toString(),'0',fillLen);
    }


    public static String getMonthNo(String prefix,int fillLen,boolean date,String keySuffix,String splitFix) {
        String no = StringUtils.isNotEmpty(keySuffix)?keySuffix:"";
        if(date){
            no = no + DateUtils.dateTimeNow().substring(0, 6);
        }
        //保存redis中的key，注意不要重复
        String redisKey = CacheConstants.UNIQUE_NO + no;
        //利用increment即redis原生incrBy命令的原子性特性生成递增的序列号
        Long increment = RedisUtils.incrAtomicValue(redisKey);
        if (increment == null) {
            throw new RuntimeException("redis命令执行失败");
        }
        //设置自动过期时间
        if(date){
            RedisUtils.expire(redisKey, time * 3);
        }
        String resultNo = StringUtils.isNotEmpty(prefix)?prefix:"";
        if(date){
            resultNo = resultNo +splitFix+ DateUtils.dateTimeNow().substring(0,6);
        }
        return resultNo +splitFix+ StrUtil.fillBefore(increment.toString(),'0',fillLen);
    }











}
